package NarkyPackage;

import java.awt.Rectangle;
import java.awt.Graphics;
import java.awt.Color;

/**
 * Clase cuyas instancias representan a los malos del juego.
 * 
 * @author GameTECH
 * @version 1.0
 *
 */
public class Malo extends ElementoDeNarkyKong {

	public String tipoDeMalo;
	private int motion;
	private int contSiguienteDisparo = 0;
	private int contDisparoAnimacion = 0;
	private int contAntesDeDesaparecer = 10;
	private int valor = 0;
	private int xMin, xMax;
	private boolean muerto = false;
	private int animacionCount;
	private int dibujoAnimacion;


	public Malo (String tipoDeMalo, Juego juego, int posX, int posY, int rangoDeMovimiento) {
		super (juego);
		this.tipoDeMalo = tipoDeMalo;
		xMin = posX;
		xMax = posX + rangoDeMovimiento;
		animacionCount = 0;
		dibujoAnimacion = 1;

		if (tipoDeMalo.equals("Kong")) {
			this.setImage(juego.applet.cargarImagen("RESIZENarkyKongAventando2"));
			this.setRect( new Rectangle (posX, posY+11, 67,70));
			motion = 0;
			valor = 100;
			this.registrarBala("bola", 49);
		} else if (tipoDeMalo.equals("Carro")) {
			motion = 7;
			this.setImage(juego.applet.cargarImagen("RESIZEMonoMaloMotorizado" + dibujoAnimacion));
			this.setRect( new Rectangle (posX, posY, 90, 66));
			this.registrarBala("normal", 20);
			valor = 50;
		} else {
			motion = 7;
			this.setImage(juego.applet.cargarImagen("Malo1"));
			this.setRect( new Rectangle (posX, posY, 65, 58));
			valor = 20;
			this.registrarBala("normal", 0);
		}

	}

	/**
	 * Le dice al juego que quite a el (el malo) del juego y que ya no se dibuje.
	 */
	public void recibirDisparo() {
		juego.addScore(valor);
		muerto = true;
		this.setImage(juego.applet.cargarImagen("ExplosionMonosMalos"));
	}


	public void disparar(){
		if (tipoDeMalo.equals("Kong")) {
			super.disparar();
			this.setImage(juego.applet.cargarImagen("NarkyParado"));
			contDisparoAnimacion = 5;
		} else {
			//Rectangle me = this.getRect();
			//if ((me.getX() >= (xMin + 10) && this.getDireccion() < 0)
			//	|| ((me.getX() + me.getWidth()) <= (xMax - 10) && this.getDireccion() > 0 )){
			super.disparar();
			//}
		}
	}

	/**
	 *  Manda al malo a avanzar en la direccion hacia la que esta volteando, si llega a algun obstaculo
	 *  se voltea. Si el jugador esta cerca del malo entonces le puede disparar. 
	 */
	public void actualizar() {
		super.actualizar();

		if (!tipoDeMalo.equals("Kong")){
			animacionCount++;
			if (animacionCount > 15)
				dibujoAnimacion++;
			if (dibujoAnimacion > 3)
				dibujoAnimacion = 1;

			this.setImage(juego.applet.cargarImagen("RESIZEMonoMaloMotorizado" + dibujoAnimacion));
		}

		if (muerto) {
			contAntesDeDesaparecer--; 
			if (contAntesDeDesaparecer <= 0) {
				juego.removerElemento(this);
			} else if (contAntesDeDesaparecer <= 7) {
				this.setImage(juego.applet.cargarImagen("ExplosionHumito"));
				Rectangle old = this.getRect();
				int crecerW = -3;
				int crecerH = -6;
				int moverseX = 0;
				int moverseY = -7;
				this.setRect(new Rectangle ((int)old.getX() - crecerW + moverseX,
						(int)old.getY() -crecerH + moverseY,
						(int)old.getWidth() + (2*crecerW), (int)old.getHeight() + (2*crecerH)));

			}
			return;
		}

		Rectangle me = this.getRect();

		if (me.getX() > xMax){
			this.setDireccion(-1);
		} else if (me.getX() < xMin) {
			this.setDireccion(1);
		}

		this.move(motion*this.getDireccion(), 0);

		if (tipoDeMalo.equals("Kong")) {
			if (contDisparoAnimacion > 0) {
				contDisparoAnimacion--;
				if (contDisparoAnimacion == 0) 
					this.setImage(juego.applet.cargarImagen("RESIZENarkyKongAventando2"));
			}
			contSiguienteDisparo++;
			if (contSiguienteDisparo == 75) {
				disparar();
				contSiguienteDisparo = 0;
			}
		} else {

			// <BLOQUE DE DISPARAR>
			int x, y, width, height;
			height = (int)me.getHeight();
			x = 0;
			y = (int)me.getY();
			if (this.getDireccion() > 0) {
				//Se mueve a la derecha
				x = (int)(me.getX() + me.getWidth());
				width = juego.getWidth() - x;
			} else {
				//Se mueve a la izq
				x = 0;
				width = (int)me.getX();
			}

			Rectangle vision = new Rectangle(x, y, width, height);
			if (juego.debugScreen){
				Graphics g =juego.getGraphics();
				g.setColor(Color.blue);
				g.drawRect(x, y, width, height);
			}

			ElementoDeNarkyKong e = juego.hayAlguienMas(vision);
			if (e != null && e.tipoDeElemento().equals("Jugador")) {
				this.disparar();
			}
			// </BLOQUE DE DISPARAR>

			// <BLOQUE DE VOLTEARSE SI SE ACERCA MARIO>
			/*
			width = 200;
			if (this.getDireccion() > 0) {
				//Se mueve a la derecha
				x = (int)(me.getX() - width);
			} else {
				//Se mueve a la izq
				x = (int)(me.getX() + me.getWidth());
			}

			vision = new Rectangle (x, y, width, height);

			if (juego.debugScreen) {
				Graphics g =juego.getGraphics();
				g.setColor(Color.red);
				g.drawRect(x, y, width, height);
			}

			e = juego.hayAlguienMas(vision);
			if (e != null && e.tipoDeElemento().equals("Jugador")) {
				this.setDireccion(this.getDireccion() * -1);
			}
			 */

			// </BLOQUE DE VOLTEARSE SI SE ACERCA MARIO>
		}

		// <SI TOCAS A UN MALO TE LLEVA>

		ElementoDeNarkyKong e = juego.hayAlguienMas(this);
		if (e != null && e.tipoDeElemento().equals("Jugador")) {
			e.recibirDisparo();
		}
		// </SI TOCAS A UN MALO TE LLEVA>
	}

	/**
	 * Permite saber si hay un malo en la posicion que se indica
	 * solo se toma en cuenta si el malo no esta muerto.
	 */
	public boolean ocupaEstaPosicion(Rectangle rect) {
		if (muerto)
			return false;
		else
			return super.ocupaEstaPosicion(rect);
	}

	public String tipoDeElemento() {
		return "Malo";
	}


}
